package com.supor.aiot.common.helper;

import android.content.res.AssetFileDescriptor;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.SoundPool;
import android.os.Build;
import android.os.SystemClock;

import com.android.baseconfig.common.utils.Logc;
import com.supor.aiot.common.R;
import com.supor.aiot.common.app.AppAgent;

import java.io.IOException;

/**
 * ---------------------------------------------------------------- <br>
 * Copyright (C) 2014-2020, by het, Shenzhen, All rights reserved.  <br>
 * ---------------------------------------------------------------- <br>
 * <p>
 * 描述: MediaManager <br>
 * 作者: lei <br>
 * 日期: 2021/5/12 <br>
 */
public class MediaManager {
    private static MediaManager instance;
    private MediaPlayer mMediaPlayer;
    private SoundPool soundPool;
    int voiceId;
    private int[] voiceIdMap = new int[4];
    private int soundId;
    private long time;

    public static MediaManager getInstance() {
        if (instance == null) {
            instance = new MediaManager();
        }
        return instance;
    }

    public void init() {
        //sdk版本21是SoundPool 的一个分水岭
        if (Build.VERSION.SDK_INT >= 21) {
            SoundPool.Builder builder = new SoundPool.Builder();
            //传入最多播放音频数量,
            builder.setMaxStreams(1);
            //AudioAttributes是一个封装音频各种属性的方法
            AudioAttributes.Builder attrBuilder = new AudioAttributes.Builder();
            //设置音频流的合适的属性
            attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC);
            //加载一个AudioAttributes
            builder.setAudioAttributes(attrBuilder.build());
            soundPool = builder.build();
        } else {
            /**
             * 第一个参数：int maxStreams：SoundPool对象的最大并发流数
             * 第二个参数：int streamType：AudioManager中描述的音频流类型
             *第三个参数：int srcQuality：采样率转换器的质量。 目前没有效果。 使用0作为默认值。
             */
            soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
        }

        //可以通过四种途径来记载一个音频资源：
        //1.通过一个AssetFileDescriptor对象
        //int load(AssetFileDescriptor afd, int priority)
        //2.通过一个资源ID
        //int load(Context context, int resId, int priority)
        //3.通过指定的路径加载
        //int load(String path, int priority)
        //4.通过FileDescriptor加载
        //int load(FileDescriptor fd, long offset, long length, int priority)
        //声音ID 加载音频资源,这里用的是第二种，第三个参数为priority，声音的优先级*API中指出，priority参数目前没有效果，建议设置为1。
        voiceIdMap[0] = soundPool.load(AppAgent.getApp(), R.raw.air_fryer_finish, 1);
        voiceIdMap[1] = soundPool.load(AppAgent.getApp(), R.raw.step_finish, 1);
        voiceIdMap[2] = soundPool.load(AppAgent.getApp(), R.raw.health_pot_finish, 1);
        voiceIdMap[3] = soundPool.load(AppAgent.getApp(), R.raw.beep, 1);
        // voiceId = soundPool.load(DyApplication.getInstance(), R.raw.charging, 1);
        // voiceIdMap[1] = voiceId;
    }

    /**
     * 播放提示音
     *
     * @param type 0-空气炸锅完成|1-空气炸锅翻面|2-养生壶完成
     */
    public synchronized void soundPoolPlay(int type) {
        //第一个参数soundID
        //第二个参数leftVolume为左侧音量值（范围= 0.0到1.0）
        //第三个参数rightVolume为右的音量值（范围= 0.0到1.0）
        //第四个参数priority 为流的优先级，值越大优先级高，影响当同时播放数量超出了最大支持数时SoundPool对该流的处理
        //第五个参数loop 为音频重复播放次数，0为值播放一次，-1为无限循环，其他值为播放loop+1次
        //第六个参数 rate为播放的速率，范围0.5-2.0(0.5为一半速率，1.0为正常速率，2.0为两倍速率)
        // if (++count > 1) {
        //     count = 0;
        // }
        if (SystemClock.uptimeMillis() - time < 800) {
            return;
        }
        time = SystemClock.uptimeMillis();
        // soundPool.stop(soundId);
        soundId = soundPool.play(voiceIdMap[type], 1, 1, 1, 0, 1);
    }

    public void voiceTip(String path) {
        voiceTip(path, null);
    }

    /**
     * 当前的MediaPlayer是否正在播放
     *
     * @return 当前的MediaPlayer是否正在播放
     */
    public boolean isPlaying() {
        if (mMediaPlayer == null) {
            return false;
        } else {
            return mMediaPlayer.isPlaying();
        }
    }

    /**
     * 开始播放音频
     *
     * @param path 当前要播放音频的名称
     */
    public void voiceTip(String path, final MediaPlayerListener listener) {
        try {
            if (mMediaPlayer != null) {
                if (mMediaPlayer.isPlaying()) {
                    mMediaPlayer.pause();
                }
                releaseMediaPlayer();
            }
            mMediaPlayer = new MediaPlayer();
            AssetFileDescriptor fileDescriptor =
                    AppAgent.getApp().getAssets().openFd(path);
            mMediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),
                    fileDescriptor.getStartOffset(), fileDescriptor.getLength());
            // 设置音频流的类型
            mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mMediaPlayer.prepareAsync();
            mMediaPlayer.setOnPreparedListener(mp -> {
                // 装载完毕 开始播放流媒体
                Logc.e("mMediaPlayer  start");
                mMediaPlayer.start();
            });
            mMediaPlayer.setOnCompletionListener(mp -> {
                if (listener != null) {
                    Logc.e("mMediaPlayer  Completion");
                    listener.onCompletion();
                }
                releaseMediaPlayer();
            });
            mMediaPlayer.setOnErrorListener((mp, what, extra) -> {
                Logc.e("mMediaPlayer  error");
                releaseMediaPlayer();
                return false;
            });
        } catch (IOException e) {
            e.printStackTrace();
            Logc.i("mMediaPlayer 播放失败****" + e.getMessage());
        }

    }

    /**
     * 停止语音
     */
    public void stopMediaPlayer() {
        try {
            if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
                mMediaPlayer.stop();
                releaseMediaPlayer();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 释放音频资源
     */
    public void releaseMediaPlayer() {
        try {
            if (mMediaPlayer != null) {
                mMediaPlayer.stop();
                mMediaPlayer.release();
                mMediaPlayer = null;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public interface MediaPlayerListener {
        void onCompletion();
    }
}
